package com.wrl.mmall.common;

import com.wrl.mmall.util.PropertiesUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author Wang Renlei
 * @Date 2019/10/10 0010
 */
public class RedisPool {

    //Jedis连接池
    private static JedisPool pool;
    //最大连接数
    private static Integer maxTotal = Integer.valueOf(PropertiesUtil.getProperty("redis.max.total", "20"));
    //在jedispool中最大的idle（空闲）状态的jedis实例个数
    private static Integer maxIdle = Integer.valueOf(PropertiesUtil.getProperty("redis.max.idle", "10"));
    //在jedispool中最小的idle状态的jedis实例个数
    private static Integer minIdle = Integer.valueOf(PropertiesUtil.getProperty("redis.min.idle", "2"));
    //在borrow一个实例的时候，是否进行验证操作，如果赋值为true。则得到的jedis实例肯定是可以用的。
    private static Boolean testOnBorrow = Boolean.valueOf(PropertiesUtil.getProperty("redis.test.borrow", "true"));
    //在return一个实例的时候，是否进行验证操作，如果赋值为true。则放回jedispool的jedis实例肯定是可以用的。
    private static Boolean testOnReturn = Boolean.valueOf(PropertiesUtil.getProperty("redis.test.return", "true"));

    private static String redisIp = PropertiesUtil.getProperty("redis1.ip");
    private static Integer redisProt = Integer.valueOf(PropertiesUtil.getProperty("redis1.port"));
    private static String redisPassword = PropertiesUtil.getProperty("redis.password");

    //只在项目启动的时候初始化一次，并且防止其它人调用
    static {
//        其实已经改用了sharded分布式redis
        initPool();
    }

    //初始化连接池。服务器启动的时候调用一次
    private static void initPool() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        config.setTestOnBorrow(testOnBorrow);
        config.setTestOnReturn(testOnReturn);

        //连接耗尽的时候，是否阻塞。
        //true 会阻塞，等待空闲的连接，如果等待超时会抛出异常
        //false 不会阻塞，连接耗尽，直接抛出异常，与上面的异常不一样
        config.setBlockWhenExhausted(true);

        pool = new JedisPool(config, redisIp, redisProt, 1000 * 2, redisPassword);
    }


    //从连接池拿一个实例
    public static Jedis getJedis() {
        return pool.getResource();
    }

}
